﻿using Microsoft.Reporting.WebForms;
using Pe.Petecos.Comercial.Aplicacion.Core.Base;
using Pe.Petecos.Comercial.Aplicacion.Core.ServiceContract;
using Pe.Petecos.Comercial.Aplicacion.TransferObject.Correo;
using Pe.Petecos.Comercial.Aplicacion.TransferObject.Ventas;
using Pe.Petecos.Comercial.Cross.Core.Constantes;
using Pe.Petecos.Comercial.Presentacion.Core.Controllers.Base;
using Pe.Petecos.Comercial.Presentacion.Core.Security;
using Pe.Petecos.Comercial.Presentacion.Core.ViewModel.Ventas;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;

namespace Pe.Petecos.Comercial.Presentacion.Core.Controllers.Ventas
{
    public class AdministrarOrdenCompraController : GenericController
    {
        public IGeneralService generalService { get; set; }
        public IVentasService ventasService { get; set; }
        public ICorreoService correoService { get; set; }

        #region Action
        /// /// <summary>
        /// Muestra la vista principal
        /// </summary>
        /// <returns>Vista principal de la opción</returns>
        public ActionResult Index()
        {
            var result = generalService.BuscarOpcion(DatosConstantes.Parametro.EstadoOrdenCompra).Result;
            var model = new AdministrarOrdenCompraBusquedaModel(result);

            return View(model);
        }

        #endregion

        #region Vistas Parciales
        /// <summary>
        /// Muestra el formulario de datos
        /// </summary>
        /// <returns>Vista FormularioRegistro</returns>
        public ActionResult FormularioRegistro(int codigo)
        {
            var monedas = generalService.BuscarOpcion(DatosConstantes.Parametro.Moneda).Result;
            var modelo = new AdministrarOrdenCompraRegistroModel(monedas);
            if (codigo > 0)
            {
                var ordenCompra = ventasService.ObtenerOrdenCompra(codigo).Result;
                modelo.OrdenCompra = ordenCompra;
            }

            return View(modelo);
        }

        #endregion

        #region Json

        public JsonResult Buscar(FiltroOrdenCompra filtro)
        {
            var resultado = ventasService.BuscarOrdenCompra(filtro);
            return Json(resultado);
        }

        public JsonResult Registrar(DataOrdenCompra ordenCompra)
        {
            var currentAccount = HttpSessionContext.CurrentAccount();
            ordenCompra.UsuarioCreacion = currentAccount.Cuenta;
            ordenCompra.UsuarioModificacion = currentAccount.Cuenta;
            var resultado = ventasService.RegistrarOrdenCompra(ordenCompra);
            return Json(resultado);
        }

        public JsonResult Aprobar(List<int> codigos)
        {

            ProcessResult<List<int>> resultado = new ProcessResult<List<int>>();

            var currentAccount = HttpSessionContext.CurrentAccount();

            if (currentAccount.CodigoPerfil == DatosConstantes.Perfil.Administrador || currentAccount.CodigoPerfil == DatosConstantes.Perfil.Aprobador)
            {
                resultado = ventasService.ModificarEstadoOrdenCompra(codigos, DatosConstantes.EstadoOrdenCompra.Aprobado, currentAccount.Cuenta);
            }
            else
            {
                resultado.CodeResult = -1;
            }

            return Json(resultado);
        }

        public JsonResult Anular(List<int> codigos)
        {
            var currentAccount = HttpSessionContext.CurrentAccount();
            var resultado = ventasService.ModificarEstadoOrdenCompra(codigos, DatosConstantes.EstadoOrdenCompra.Eliminado, currentAccount.Cuenta);
            return Json(resultado);
        }

        public JsonResult BuscarProyectoDetalle(int codigoProyecto, int codigoProveedor, List<int> codigos) // List<int[]>
        {
            var resultado = ventasService.BuscarProyectoDetalle(codigoProyecto, codigoProveedor);
            codigos = (codigos == null) ? new List<int>() : codigos;

            resultado.Result = resultado.Result.Where(x => !codigos.Contains(x.CodigoArticulo)).ToList();
            //resultado.Result = resultado.Result.Where(x => !codigos(0).Contains(x.CodigoArticulo)).ToList();
            //ProcessResult<List<DataProyectoDetalle>> listaResumen = new ProcessResult<List<DataProyectoDetalle>>();
            //List<int[]> lista = new List<int[]>();
            //var lista = resultado.Result.GroupBy(x => x.CodigoArticulo).Select(xg => xg.Sum(item=>item.Cantidad));
            
            return Json(resultado);
        }

        public JsonResult BuscarProveedorProyecto(int codigoProyecto)
        {
            var resultado = generalService.BuscarProveedorProyecto(codigoProyecto);
            return Json(resultado);
        }

        public JsonResult Copiar(int codigo)
        {
            var currentAccount = HttpSessionContext.CurrentAccount();
            var cuenta = currentAccount.Cuenta;
            var resultado = ventasService.CopiarOrdenCompra(codigo, cuenta);
            return Json(resultado);
        }

        #endregion

        #region File
        public FileResult Exportar(int codigo)
        {
            var archivo = ventasService.GenerarDocumentoOrdenCompra(codigo, "EXCELOPENXML");
            var nombre = "ordenCompra" + DateTime.Now.ToString("_ddMMyyyy_hhmmss") + ".xlsx";
            return File(archivo.Result, System.Net.Mime.MediaTypeNames.Application.Octet, nombre);
        }
        #endregion
    }
}
